package com.tangruojie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tangruojie.domain.po.User;
import com.tangruojie.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Objects;

@Component
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
                .eq(User::getUserName, username);
        User user = userMapper.selectOne(wrapper);
        if (Objects.isNull(user)) {
            throw new RuntimeException("用户不存在");
        }
        // 获取角色信息
        List<String> roles = userMapper.selectRolesByUserId(user.getId());
        // 获取权限信息
        List<String> permissions = userMapper.selectPermissionsByUserId(user.getId());
        return new UserDetailsImpl(user, permissions, roles);
    }

}
/**
 * 🔹 两种常见做法
 * ✅ 做法 1：角色 → 权限
 * 用户登录时只查角色，例如 admin。
 * 再根据角色去数据库查出一堆权限（sys:user:query、sys:user:add 等），最终放进 authorities。
 * 效果：
 * hasAuthority("sys:user:query") ✅
 * 但是 hasRole("admin") ❌，因为你没把角色本身放进去。
 * 👉 这种做法等于“角色只是权限的容器”，最后还是靠权限控制。
 * ✅ 做法 2：角色 + 权限一起放
 * 登录时，既查角色，也查权限。
 * 放进 authorities 的集合里同时包含：
 * "ROLE_admin"（角色字符串）
 * "sys:user:query"（权限字符串）
 * "sys:user:add" …
 * 效果：
 * hasRole("admin") ✅
 * hasAuthority("sys:user:query") ✅
 * 👉 这种做法就是 Spring Security 的“正宗姿势”，角色和权限都能直接校验。
 */